热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

拓端tecdat|sas文本挖掘案例:如何使用SAS计算WordMover的距离

原文链接:http:tecdat.cn?p6181原文出处:拓端数据部落公众号WordMover的距离(WMD)是用于衡量

原文链接:http://tecdat.cn/?p=6181


原文出处:拓端数据部落公众号

Word Mover的距离(WMD)是用于衡量两个文档之间差异的距离度量,它在文本分析中的应用是由华盛顿大学的一个研究小组在2015年引入的。


Word Mover距离的定义

WMD是两个文档之间的距离,作为将所有单词从一个文档移动到另一个文档所需的最小(加权)累积成本。通过解决以下线性程序问题来计算距离。

T ij表示文档d中的单词i在文档d'中移动到单词j的多少;

C(1; j)的表示从文件d中的单词我到文件d '中的单词J‘行进’的费用; 这里的成本是word2vec嵌入空间中的两个词'欧几里德距离;

如果字我出现Ç我在文档d次,我们记

WMD是地球移动器距离度量(EMD)的一个特例,这是一个众所周知的运输问题。


如何用SAS计算地球移动的距离?

SAS / OR是解决运输问题的工具。图1显示了一个带有四个节点和节点之间距离的传输示例,我从这个Earth Mover的距离文档中复制了这些节点。目标是找出从{x1 ,x2}到{y1,y2}的最小流量。现在让我们看看如何使用SAS / OR解决这个运输问题。

节点的权重和节点之间的距离如下。

图-1运输问题

datax_set;input_node_ $ _sd_;datalines;
x10.74x20.26;datay_set;
input_node_ $ _sd_;
datalines;
​y10.23y20.51;
dataarcdata;input_tail_ $ _head_ $ _cost_;datalines;
x1 y1155.7x1 y2252.3x2 y1292.9x2 y2198.2;proc optmodel;
setxNODES;
​num w{xNODES};
​setyNODES;
num u{yNODES};set ARCS;
num arcCost{ARCS};
readdatax_setintoxNODES=[_node_]w=_sd_;
readdatay_setintoyNODES=[_node_]u=_sd_;
readdataarcdataintoARCS=[_tail_ _head_]arcCost=_cost_;
varflow{inARCS}>=0;
impvar sumY =sum{jinyNODES}u[j];
minobj =(sum{inARCS}arcCost[i,j]* flow[i,j])/sumY;
con con_y{jinyNODES}:sum{inARCS}flow[i,j]= u[j];
con con_x{iinxNODES}:sum{<(i),j>inARCS}flow[i,j]<&#61; w[i];solve with lp / algorithm&#61;ns scale&#61;none logfreq&#61;1;print flow;​quit;


 

SAS / OR的解决方案如表-1所示&#xff0c;EMD是目标值&#xff1a;203.26756757。

表-1 EMD用SAS / OR计算

我用SAS / OR表2得到的流量数据显示如下&#xff0c;与上述地球移动器距离文档中公布的图表相同。

表-2 SAS / OR的流量数据

图-2运输问题流程图


如何用SAS计算Word Mover的距离

本文从Word嵌入到文档距离&#xff0c;通过删除WMD的第二个约束来减少计算&#xff0c;提出了一个名为放松的Word Mover距离&#xff08;RWMD&#xff09;的新度量。由于我们需要读取文字嵌入数据&#xff0c;因此我将向您展示如何使用SAS Viya计算两个文档的RWMD。

/* start CAS server */cas casauto host&#61;"host.example.com"port&#61;5570;libnamesascas1 cas;/* load documents into CAS */datasascas1.documents;infiledatalines delimiter&#61;&#39;|&#39;missover;lengthtext varchar(300);inputtext$ did;datalines;Obama speaks to the mediainIllinois.|1The President greets the pressinChicago.|2;run;/* create stop list*/datasascas1.stopList;infiledatalines missover;lengthterm $20;inputterm$;datalines;thetoin;run;/* load word embedding model */proc cas;loadtable path&#61;&#39;datasources/glove_100d_tab_clean.txt&#39;caslib&#61;"CASTestTmp"importOptions&#61;{fileType&#61;"delimited",delimiter&#61;&#39;\t&#39;,getNames&#61;True,guessRows&#61;2.0,varChars&#61;True}casOut&#61;{name&#61;&#39;glove&#39;replace&#61;True};run;quit;%macrocalculateRWMD(textDS&#61;documents,documentID&#61;did,text&#61;text,language&#61;English,stopList&#61;stopList,word2VectDS&#61;glove,doc1_id&#61;1,doc2_id&#61;2);/* text parsing and aggregation */proc cas;textParse.tpParse/table&#61;{name&#61;"&textDS",where&#61;"&documentID&#61;&doc1_id or &documentID&#61;&doc2_id"}docId&#61;"&documentID",language&#61;"&language",stemming&#61;False,nounGroups&#61;False,tagging&#61;False,offset&#61;{name&#61;"outpos",replace&#61;1},text&#61;"&text";run; textparse.tpaccumulate/parent&#61;{name&#61;"outparent1",replace&#61;1}language&#61;"&language",offset&#61;&#39;outpos&#39;,stopList&#61;{name&#61;"&stoplist"},terms&#61;{name&#61;"outterms1",replace&#61;1},child&#61;{name&#61;"outchild1",replace&#61;1},reduce&#61;1,cellweight&#61;&#39;none&#39;,termWeight&#61;&#39;none&#39;;run;quit;/* terms of the two test documents */proc cas;loadactionset"fedsql";execdirect casout&#61;{name&#61;"doc_terms",replace&#61;true}query&#61;"select outparent1.*,_term_from outparent1left join outterms1on outparent1._termnum_ &#61; outterms1._termnum_where _Document_&#61;&doc1_id or _Document_&#61;&doc2_id;";run;quit;/* term vectors and counts of the two test documents */proc cas;loadactionset"fedsql";execdirect casout&#61;{name&#61;"doc1_termvects",replace&#61;true}query&#61;"select word2vect.*from &word2VectDS word2vect, doc_termswhere _Document_&#61;&doc2_id and lowcase(term) &#61; _term_;";run; execdirect casout&#61;{name&#61;"doc1_terms",replace&#61;true}query&#61;"select doc_terms.*from &word2VectDS, doc_termswhere _Document_&#61;&doc2_id and lowcase(term) &#61; _term_;";run; simple.groupBy /table&#61;{name&#61;"doc1_terms"}inputs&#61;{"_Term_","_Count_"}aggregator&#61;"n"casout&#61;{name&#61;"doc1_termcount",replace&#61;true};run;quit;proc cas;loadactionset"fedsql";execdirect casout&#61;{name&#61;"doc2_termvects",replace&#61;true}query&#61;"select word2vect.*from &word2VectDS word2vect, doc_termswhere _Document_&#61;&doc1_id and lowcase(term) &#61; _term_;";run; execdirect casout&#61;{name&#61;"doc2_terms",replace&#61;true}query&#61;"select doc_terms.*from &word2VectDS, doc_termswhere _Document_&#61;&doc1_id and lowcase(term) &#61; _term_;";run; simple.groupBy /table&#61;{name&#61;"doc2_terms"}inputs&#61;{"_Term_","_Count_"}aggregator&#61;"n"casout&#61;{name&#61;"doc2_termcount",replace&#61;true};run;quit;/* calculate Euclidean distance between words */datadoc1_termvects;setsascas1.doc1_termvects;run;datadoc2_termvects;setsascas1.doc2_termvects;run;proc iml;use doc1_termvects;read allvar_char_intolterm;read allvar_num_intox;closedoc1_termvects; use doc2_termvects;read allvar_char_intorterm;read allvar_num_intoy;closedoc2_termvects; d &#61; distance(x,y); lobs&#61;nrow(lterm);robs&#61;nrow(rterm);d_out&#61;j(lobs*robs, 3, &#39; &#39;);doi&#61;1to lobs;doj&#61;1to robs;d_out[(i-1)*robs&#43;j,1]&#61;lterm[i];d_out[(i-1)*robs&#43;j,2]&#61;rterm[j];d_out[(i-1)*robs&#43;j,3]&#61;cats(d[i,j]);end;end;createdistancefromd_out;appendfromd_out;closedistance;run;quit;/* calculate RWMD between documents */datax_set;setsascas1.doc1_termcount;rename_term_&#61;_node_;_weight_&#61;_count_;run;datay_set;setsascas1.doc2_termcount;rename_term_&#61;_node_;_weight_&#61;_count_;run;dataarcdata;setdistance;renamecol1&#61;_tail_;renamecol2&#61;_head_;length_cost_8;_cost_&#61; col3;run;proc optmodel;setxNODES;num w{xNODES};setyNODES;num u{yNODES};set ARCS;num arcCost{ARCS}; readdatax_setintoxNODES&#61;[_node_]w&#61;_weight_;readdatay_setintoyNODES&#61;[_node_]u&#61;_weight_;readdataarcdataintoARCS&#61;[_tail_ _head_]arcCost&#61;_cost_;varflow{inARCS}>&#61;0;impvar sumY &#61;sum{jinyNODES}u[j];minobj &#61;(sum{inARCS}arcCost[i,j]* flow[i,j])/sumY;con con_y{jinyNODES}:sum{inARCS}flow[i,j]&#61; u[j];/* con con_x {i in xNODES}: sum {<(i),j> in ARCS} flow[i,j] <&#61; w[i];*/solve with lp / algorithm&#61;ns scale&#61;none logfreq&#61;1;callsymput(&#39;obj&#39;, strip(put(obj,best.)));createdataflowDatafrom[i j]&#61;{inARCS: flow[i,j].sol >0}col("cost")&#61;arcCost[i,j]col("flowweight")&#61;flow[i,j].sol;run;quit;%putRWMD&#61;&obj;%mendcalculateRWMD; %calculateRWMD(textDS&#61;documents,documentID&#61;did,text&#61;text,language&#61;English,stopList&#61;stopList,word2VectDS&#61;glove,doc1_id&#61;1,doc2_id&#61;2);proc printdata&#61;flowdata;run;quit;

WMD方法不仅可以测量文档的相似性&#xff0c;还可以通过可视化流数据来解释为什么这两个文档是相似的。

 


推荐阅读
  • 在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转
    本文探讨了在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转的技术细节。通过详细分析Swscale的工作原理和实际应用,展示了如何在Android环境中高效地进行图像格式转换。此外,还介绍了FFmpeg的全平台编译过程,包括x264和fdk-aac的集成,并在Ubuntu系统中配置Nginx和Nginx-RTMP-Module以支持直播推流服务。这些技术的结合为音视频处理提供了强大的支持。 ... [详细]
  • 本文深入探讨了 HTML 中的 `margin` 属性,详细解析了其基本特性和应用场景。文章不仅介绍了 `margin` 的基本概念,还重点讨论了垂直外边距合并现象,并分析了 `margin` 在块级元素与内联元素中的不同表现。通过实例和代码示例,帮助读者全面理解 `margin` 的使用技巧和常见问题。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 在单个图表中实现饼图与条形图的精准对齐 ... [详细]
  • 在Unity中进行3D建模的全面指南,详细介绍了市场上三种主要的3D建模工具:Blender 3D、Maya和3ds Max。每种工具的特点、优势及其在Unity开发中的应用将被深入探讨,帮助开发者选择最适合自己的建模软件。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 探索JavaScript倒计时功能的三种高效实现方法及代码示例 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 第五章详细探讨了 Red Hat Enterprise Linux 6 中的 Ext3 文件系统。5.1 节介绍了如何创建 Ext3 文件系统,包括必要的命令和步骤,以及在实际操作中可能遇到的问题和解决方案。此外,还涵盖了 Ext3 文件系统的性能优化和维护技巧,为用户提供全面的操作指南。 ... [详细]
author-avatar
心悦随鑫_196
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有